package simbolos;

import java.util.HashMap;

import simbolos.Propiedades.tClase;


/**
 * 
 * 
 * NUEVA TABLA DE SIMBOLOS!!!!!!!
 * 
 *
 */
public class TablaSimbolos {
	
	private HashMap<String, Propiedades> ts;
	
	public TablaSimbolos(){
		ts = null;
	}
	
	public HashMap<String, Propiedades> creaTS(){
		ts = new HashMap<String, Propiedades>();
		return ts;
	}
	
	public HashMap<String, Propiedades> anyadeID(String id, Propiedades props){
		ts.put(id, props);
		return ts;
	}
	
	public boolean existeID(String id){
		return ts.containsKey(id);
	}

	public HashMap<String, Propiedades> dameTs() {
		return ts;
	}

	public void ponTs(HashMap<String, Propiedades> ts) {
		this.ts = ts;
	}

	public int dameDir(String id){
		if (!ts.containsKey(id)) 
			return 0;
		else{ 
			if (ts.get(id).dameClase() == tClase.VariableParametro){
		    	Propiedades props = ts.get(id);
		    	return props.dameTipoPropiedades().dameDir();
		    }
		    else if (ts.get(id).dameClase() == tClase.Tipo){
		    	//EL TIPO NO TIENE DIRECCION			
		    	return -10;
			}
		    else if (ts.get(id).dameClase() == tClase.Procedimiento){			
			}
		    else return 0;
		}
		return 0;
	}
	
	public int dameTam(String id){
		if (!ts.containsKey(id)) 
			return 0;
		else{ 
			Propiedades props = ts.get(id);
		    return props.dameTipoPropiedades().dameTam();
		}    
	}
	
	public String dameTipo(String id){
		if (!ts.containsKey(id)) 
			return "ERROR";
		else{ 
			Propiedades props = ts.get(id);
			return props.dameTipoPropiedades().dameTipo();
		}
	}
	
	public int dameNivel(String id){
		if(!ts.containsKey(id)) return -10;
		else{
			Propiedades prop = ts.get(id);
			return prop.dameTipoPropiedades().dameNivel();
		}
	}

	public Propiedades juntaProps(Propiedades p, TipoPropiedades tp) {
		if(tp != null){
			if(tp.dameNivel() != -1) p.dameTipoPropiedades().ponNivel(tp.dameNivel());
			if(tp.dameDir() != -1) p.dameTipoPropiedades().ponDir(tp.dameDir());
			if(tp.dameTam() != -1) p.dameTipoPropiedades().ponTam(tp.dameTam());
			if(tp.dameTipo() != null) p.dameTipoPropiedades().ponTipo(tp.dameTipo());
			if(tp.dameIdRef() != null) p.dameTipoPropiedades().ponIdRef(tp.dameIdRef());
			if(tp.dameCampos() != null) p.dameTipoPropiedades().ponCampos(tp.dameCampos());
			if(tp.damenElems() != -1) p.dameTipoPropiedades().ponnElems(tp.damenElems());
			if(tp.dametBase() != null) p.dameTipoPropiedades().pontBase(tp.dametBase());
		}
		return p;
	}

	public boolean referenciaErronea(TipoPropiedades tp, String id) {
		return (tp.dameTipo().equals("ref") && !this.existeID(id));
	}

	public tClase dameClase(String id) {
		return this.ts.get(id).dameClase();
	}
}